- 快排法(时间复杂度
- 选择基准数,(一般选需要排序数组的第一个元素array[0])
- 从右往左找到第一个小于该基准数的值array[j]
- 从左往右找到第一个大于该基准值的值array[i]
- 交换i、j位置的数值
- 重复步骤2-4,直到i==j
- 此时i==j,交换基准点和位置i的数值,完成对第一个基准点的归位
- 此时该基准点在位置i处,对位置i左右分别重复1-6步进行快排操作
/* c */
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
void quickSort(int array[], int left, int right)
{
assert(array != NULL);
//对一个数据排序,或者左下标大于有下标时,直接返回
if(left >= right)
{
return;
}
//对2个数据排序,排序返回
int left_index = left+1;
int right_index = right;
if(left_index == right_index)
{
if(array[left] > array[right])
{
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
return;
}
/*对多个数据快排*/
int key = array[left];
while(left_index < right_index)
{
//从右侧找到第一个小于key的值
for(;right_index != left_index; right_index--)
{
if(array[right_index] < key)
{
break;
}
}
//从左侧找到第一个大于key的值
for(;left_index != right_index; left_index++)
{
if(array[left_index]>key)
{
break;
}
}
int tmp = array[left_index];
array[left_index] = array[right_index];
array[right_index] = tmp;
}
if(array[left_index]>=key)
{
left_index--;
}
//将第一个基准点正确归位
int tmp = array[left];
array[left] = array[left_index];
array[left_index] = tmp;
//对该基准点的左右分别进行快排
quickSort(array, left, left_index);
quickSort(array, right_index, right);
return;
}
class QuickSort(object):
def __init__(self,array):
assert array != None
self.array = array
def sort(self, left, right):
'''需要排序数据只有1个,或者left大于right'''
if left >= right:
return
'''需要排序数据有两个时'''
left_index = left+1
right_index = right
if left_index == right_index:
if self.array[left] > self.array[right]:
tmp = self.array[left]
self.array[left] = self.array[right]
self.array[right] = tmp
return
'''需要排序数据超过3个时'''
key = self.array[left]
while left_index < right_index:
#先从右侧查找第一个小于基准值的数值
while right_index != left_index:
if self.array[right_index] < key:
break
right_index -= 1
#从左侧找第一个大于基准值的数值
while left_index != right_index:
if self.array[left_index] > key:
break
left_index += 1
tmp = self.array[left_index]
self.array[left_index] = self.array[right_index]
self.array[right_index] = tmp
if array[left_index]>=key:
left_index -= 1
#第一个基准点正确归位
tmp = self.array[left]
self.array[left] = self.array[left_index]
self.array[left_index] = tmp
#对该基准点左右侧分别进行快排
self.sort(left, left_index)
self.sort(right_index, right)
def show(self):
print("Now th array is:"),
for item in self.array:
print(item),
print("")